{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pandas怎样实现groupby分组统计\n",
    "\n",
    "类似SQL：  \n",
    "select city,max(temperature) from city_weather group by city;\n",
    "\n",
    "groupby：先对数据分组，然后在每个分组上应用聚合函数、转换函数\n",
    "\n",
    "本次演示：  \n",
    "一、分组使用聚合函数做数据统计  \n",
    "二、遍历groupby的结果理解执行流程  \n",
    "三、实例分组探索天气数据  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "# 加上这一句，能在jupyter notebook展示matplot图表\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.176106</td>\n",
       "      <td>-0.719140</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>bar</td>\n",
       "      <td>one</td>\n",
       "      <td>0.316583</td>\n",
       "      <td>0.403738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>foo</td>\n",
       "      <td>two</td>\n",
       "      <td>3.027752</td>\n",
       "      <td>1.588349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>bar</td>\n",
       "      <td>three</td>\n",
       "      <td>0.670982</td>\n",
       "      <td>-0.641120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>foo</td>\n",
       "      <td>two</td>\n",
       "      <td>0.775122</td>\n",
       "      <td>0.702624</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>bar</td>\n",
       "      <td>two</td>\n",
       "      <td>-0.171018</td>\n",
       "      <td>1.814155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.759923</td>\n",
       "      <td>0.725290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>7</td>\n",
       "      <td>foo</td>\n",
       "      <td>three</td>\n",
       "      <td>0.108392</td>\n",
       "      <td>1.107748</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      B         C         D\n",
       "0  foo    one -0.176106 -0.719140\n",
       "1  bar    one  0.316583  0.403738\n",
       "2  foo    two  3.027752  1.588349\n",
       "3  bar  three  0.670982 -0.641120\n",
       "4  foo    two  0.775122  0.702624\n",
       "5  bar    two -0.171018  1.814155\n",
       "6  foo    one -0.759923  0.725290\n",
       "7  foo  three  0.108392  1.107748"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],\n",
    "                   'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],\n",
    "                   'C': np.random.randn(8),\n",
    "                   'D': np.random.randn(8)})\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一、分组使用聚合函数做数据统计"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1、单个列groupby，查询所有数据列的统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>bar</td>\n",
       "      <td>0.816546</td>\n",
       "      <td>1.576773</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>foo</td>\n",
       "      <td>2.975237</td>\n",
       "      <td>3.404871</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            C         D\n",
       "A                      \n",
       "bar  0.816546  1.576773\n",
       "foo  2.975237  3.404871"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('A').sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们看到：\n",
    "1. groupby中的'A'变成了数据的索引列\n",
    "2. 因为要统计sum，但B列不是数字，所以被自动忽略掉"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2、多个列groupby，查询所有数据列的统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td rowspan=\"3\" valign=\"top\">bar</td>\n",
       "      <td>one</td>\n",
       "      <td>0.316583</td>\n",
       "      <td>0.403738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>three</td>\n",
       "      <td>0.670982</td>\n",
       "      <td>-0.641120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>two</td>\n",
       "      <td>-0.171018</td>\n",
       "      <td>1.814155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td rowspan=\"3\" valign=\"top\">foo</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.468014</td>\n",
       "      <td>0.003075</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>three</td>\n",
       "      <td>0.108392</td>\n",
       "      <td>1.107748</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>two</td>\n",
       "      <td>1.901437</td>\n",
       "      <td>1.145486</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  C         D\n",
       "A   B                        \n",
       "bar one    0.316583  0.403738\n",
       "    three  0.670982 -0.641120\n",
       "    two   -0.171018  1.814155\n",
       "foo one   -0.468014  0.003075\n",
       "    three  0.108392  1.107748\n",
       "    two    1.901437  1.145486"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(['A','B']).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们看到：('A','B')成对变成了二级索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>bar</td>\n",
       "      <td>one</td>\n",
       "      <td>0.316583</td>\n",
       "      <td>0.403738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>bar</td>\n",
       "      <td>three</td>\n",
       "      <td>0.670982</td>\n",
       "      <td>-0.641120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>bar</td>\n",
       "      <td>two</td>\n",
       "      <td>-0.171018</td>\n",
       "      <td>1.814155</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.468014</td>\n",
       "      <td>0.003075</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>foo</td>\n",
       "      <td>three</td>\n",
       "      <td>0.108392</td>\n",
       "      <td>1.107748</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>foo</td>\n",
       "      <td>two</td>\n",
       "      <td>1.901437</td>\n",
       "      <td>1.145486</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      B         C         D\n",
       "0  bar    one  0.316583  0.403738\n",
       "1  bar  three  0.670982 -0.641120\n",
       "2  bar    two -0.171018  1.814155\n",
       "3  foo    one -0.468014  0.003075\n",
       "4  foo  three  0.108392  1.107748\n",
       "5  foo    two  1.901437  1.145486"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(['A','B'], as_index=False).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3、同时查看多种数据统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"3\" halign=\"left\">C</th>\n",
       "      <th colspan=\"3\" halign=\"left\">D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>bar</td>\n",
       "      <td>0.816546</td>\n",
       "      <td>0.272182</td>\n",
       "      <td>0.422753</td>\n",
       "      <td>1.576773</td>\n",
       "      <td>0.525591</td>\n",
       "      <td>1.232165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>foo</td>\n",
       "      <td>2.975237</td>\n",
       "      <td>0.595047</td>\n",
       "      <td>1.467816</td>\n",
       "      <td>3.404871</td>\n",
       "      <td>0.680974</td>\n",
       "      <td>0.861426</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            C                             D                    \n",
       "          sum      mean       std       sum      mean       std\n",
       "A                                                              \n",
       "bar  0.816546  0.272182  0.422753  1.576773  0.525591  1.232165\n",
       "foo  2.975237  0.595047  1.467816  3.404871  0.680974  0.861426"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('A').agg([np.sum, np.mean, np.std])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们看到：列变成了多级索引"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4、查看单列的结果数据统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>bar</td>\n",
       "      <td>0.816546</td>\n",
       "      <td>0.272182</td>\n",
       "      <td>0.422753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>foo</td>\n",
       "      <td>2.975237</td>\n",
       "      <td>0.595047</td>\n",
       "      <td>1.467816</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          sum      mean       std\n",
       "A                                \n",
       "bar  0.816546  0.272182  0.422753\n",
       "foo  2.975237  0.595047  1.467816"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 方法1：预过滤，性能更好\n",
    "df.groupby('A')['C'].agg([np.sum, np.mean, np.std])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>std</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>bar</td>\n",
       "      <td>0.816546</td>\n",
       "      <td>0.272182</td>\n",
       "      <td>0.422753</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>foo</td>\n",
       "      <td>2.975237</td>\n",
       "      <td>0.595047</td>\n",
       "      <td>1.467816</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          sum      mean       std\n",
       "A                                \n",
       "bar  0.816546  0.272182  0.422753\n",
       "foo  2.975237  0.595047  1.467816"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 方法2\n",
    "df.groupby('A').agg([np.sum, np.mean, np.std])['C']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5、不同列使用不同的聚合函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>bar</td>\n",
       "      <td>0.816546</td>\n",
       "      <td>0.525591</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>foo</td>\n",
       "      <td>2.975237</td>\n",
       "      <td>0.680974</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            C         D\n",
       "A                      \n",
       "bar  0.816546  0.525591\n",
       "foo  2.975237  0.680974"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby('A').agg({\"C\":np.sum, \"D\":np.mean})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二、遍历groupby的结果理解执行流程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "for循环可以直接遍历每个group"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1、遍历单个列聚合的分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001CBB0EEFA88>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g = df.groupby('A')\n",
    "g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "bar\n",
      "     A      B         C         D\n",
      "1  bar    one  0.316583  0.403738\n",
      "3  bar  three  0.670982 -0.641120\n",
      "5  bar    two -0.171018  1.814155\n",
      "\n",
      "foo\n",
      "     A      B         C         D\n",
      "0  foo    one -0.176106 -0.719140\n",
      "2  foo    two  3.027752  1.588349\n",
      "4  foo    two  0.775122  0.702624\n",
      "6  foo    one -0.759923  0.725290\n",
      "7  foo  three  0.108392  1.107748\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for name,group in g:\n",
    "    print(name)\n",
    "    print(group)\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***可以获取单个分组的数据***"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>bar</td>\n",
       "      <td>one</td>\n",
       "      <td>0.316583</td>\n",
       "      <td>0.403738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>bar</td>\n",
       "      <td>three</td>\n",
       "      <td>0.670982</td>\n",
       "      <td>-0.641120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>bar</td>\n",
       "      <td>two</td>\n",
       "      <td>-0.171018</td>\n",
       "      <td>1.814155</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      B         C         D\n",
       "1  bar    one  0.316583  0.403738\n",
       "3  bar  three  0.670982 -0.641120\n",
       "5  bar    two -0.171018  1.814155"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.get_group('bar')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2、遍历多个列聚合的分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "g = df.groupby(['A', 'B'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('bar', 'one')\n",
      "     A    B         C         D\n",
      "1  bar  one  0.316583  0.403738\n",
      "\n",
      "('bar', 'three')\n",
      "     A      B         C        D\n",
      "3  bar  three  0.670982 -0.64112\n",
      "\n",
      "('bar', 'two')\n",
      "     A    B         C         D\n",
      "5  bar  two -0.171018  1.814155\n",
      "\n",
      "('foo', 'one')\n",
      "     A    B         C        D\n",
      "0  foo  one -0.176106 -0.71914\n",
      "6  foo  one -0.759923  0.72529\n",
      "\n",
      "('foo', 'three')\n",
      "     A      B         C         D\n",
      "7  foo  three  0.108392  1.107748\n",
      "\n",
      "('foo', 'two')\n",
      "     A    B         C         D\n",
      "2  foo  two  3.027752  1.588349\n",
      "4  foo  two  0.775122  0.702624\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for name,group in g:\n",
    "    print(name)\n",
    "    print(group)\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，name是一个2个元素的tuple，代表不同的列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.176106</td>\n",
       "      <td>-0.71914</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.759923</td>\n",
       "      <td>0.72529</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B         C        D\n",
       "0  foo  one -0.176106 -0.71914\n",
       "6  foo  one -0.759923  0.72529"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.get_group(('foo', 'one'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***可以直接查询group后的某几列，生成Series或者子DataFrame***"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.generic.SeriesGroupBy object at 0x000001CBB0F27408>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g['C']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('bar', 'one')\n",
      "1    0.316583\n",
      "Name: C, dtype: float64\n",
      "<class 'pandas.core.series.Series'>\n",
      "\n",
      "('bar', 'three')\n",
      "3    0.670982\n",
      "Name: C, dtype: float64\n",
      "<class 'pandas.core.series.Series'>\n",
      "\n",
      "('bar', 'two')\n",
      "5   -0.171018\n",
      "Name: C, dtype: float64\n",
      "<class 'pandas.core.series.Series'>\n",
      "\n",
      "('foo', 'one')\n",
      "0   -0.176106\n",
      "6   -0.759923\n",
      "Name: C, dtype: float64\n",
      "<class 'pandas.core.series.Series'>\n",
      "\n",
      "('foo', 'three')\n",
      "7    0.108392\n",
      "Name: C, dtype: float64\n",
      "<class 'pandas.core.series.Series'>\n",
      "\n",
      "('foo', 'two')\n",
      "2    3.027752\n",
      "4    0.775122\n",
      "Name: C, dtype: float64\n",
      "<class 'pandas.core.series.Series'>\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for name, group in g['C']:\n",
    "    print(name)\n",
    "    print(group)\n",
    "    print(type(group))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "其实所有的聚合统计，都是在dataframe和series上进行的；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三、实例分组探索天气数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ymd</th>\n",
       "      <th>bWendu</th>\n",
       "      <th>yWendu</th>\n",
       "      <th>tianqi</th>\n",
       "      <th>fengxiang</th>\n",
       "      <th>fengli</th>\n",
       "      <th>aqi</th>\n",
       "      <th>aqiInfo</th>\n",
       "      <th>aqiLevel</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>3</td>\n",
       "      <td>-6</td>\n",
       "      <td>晴~多云</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>59</td>\n",
       "      <td>良</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2018-01-02</td>\n",
       "      <td>2</td>\n",
       "      <td>-5</td>\n",
       "      <td>阴~多云</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>49</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>2018-01-03</td>\n",
       "      <td>2</td>\n",
       "      <td>-5</td>\n",
       "      <td>多云</td>\n",
       "      <td>北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>28</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>2018-01-04</td>\n",
       "      <td>0</td>\n",
       "      <td>-8</td>\n",
       "      <td>阴</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>28</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>2018-01-05</td>\n",
       "      <td>3</td>\n",
       "      <td>-6</td>\n",
       "      <td>多云~晴</td>\n",
       "      <td>西北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>50</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          ymd  bWendu  yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel\n",
       "0  2018-01-01       3      -6   晴~多云       东北风   1-2级   59       良         2\n",
       "1  2018-01-02       2      -5   阴~多云       东北风   1-2级   49       优         1\n",
       "2  2018-01-03       2      -5     多云        北风   1-2级   28       优         1\n",
       "3  2018-01-04       0      -8      阴       东北风   1-2级   28       优         1\n",
       "4  2018-01-05       3      -6   多云~晴       西北风   1-2级   50       优         1"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fpath = \"./datas/beijing_tianqi/beijing_tianqi_2018.csv\"\n",
    "df = pd.read_csv(fpath)\n",
    "# 替换掉温度的后缀℃\n",
    "df.loc[:, \"bWendu\"] = df[\"bWendu\"].str.replace(\"℃\", \"\").astype('int32')\n",
    "df.loc[:, \"yWendu\"] = df[\"yWendu\"].str.replace(\"℃\", \"\").astype('int32')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ymd</th>\n",
       "      <th>bWendu</th>\n",
       "      <th>yWendu</th>\n",
       "      <th>tianqi</th>\n",
       "      <th>fengxiang</th>\n",
       "      <th>fengli</th>\n",
       "      <th>aqi</th>\n",
       "      <th>aqiInfo</th>\n",
       "      <th>aqiLevel</th>\n",
       "      <th>month</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>3</td>\n",
       "      <td>-6</td>\n",
       "      <td>晴~多云</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>59</td>\n",
       "      <td>良</td>\n",
       "      <td>2</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2018-01-02</td>\n",
       "      <td>2</td>\n",
       "      <td>-5</td>\n",
       "      <td>阴~多云</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>49</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>2018-01-03</td>\n",
       "      <td>2</td>\n",
       "      <td>-5</td>\n",
       "      <td>多云</td>\n",
       "      <td>北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>28</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>2018-01-04</td>\n",
       "      <td>0</td>\n",
       "      <td>-8</td>\n",
       "      <td>阴</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>28</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>2018-01-05</td>\n",
       "      <td>3</td>\n",
       "      <td>-6</td>\n",
       "      <td>多云~晴</td>\n",
       "      <td>西北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>50</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          ymd  bWendu  yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel  \\\n",
       "0  2018-01-01       3      -6   晴~多云       东北风   1-2级   59       良         2   \n",
       "1  2018-01-02       2      -5   阴~多云       东北风   1-2级   49       优         1   \n",
       "2  2018-01-03       2      -5     多云        北风   1-2级   28       优         1   \n",
       "3  2018-01-04       0      -8      阴       东北风   1-2级   28       优         1   \n",
       "4  2018-01-05       3      -6   多云~晴       西北风   1-2级   50       优         1   \n",
       "\n",
       "     month  \n",
       "0  2018-01  \n",
       "1  2018-01  \n",
       "2  2018-01  \n",
       "3  2018-01  \n",
       "4  2018-01  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 新增一列为月份\n",
    "df['month'] = df['ymd'].str[:7]\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1、查看每个月的最高温度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "month\n",
       "2018-01     7\n",
       "2018-02    12\n",
       "2018-03    27\n",
       "2018-04    30\n",
       "2018-05    35\n",
       "2018-06    38\n",
       "2018-07    37\n",
       "2018-08    36\n",
       "2018-09    31\n",
       "2018-10    25\n",
       "2018-11    18\n",
       "2018-12    10\n",
       "Name: bWendu, dtype: int32"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = df.groupby('month')['bWendu'].max()\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1cbb226b2c8>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2、查看每个月的最高温度、最低温度、平均空气质量指数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ymd</th>\n",
       "      <th>bWendu</th>\n",
       "      <th>yWendu</th>\n",
       "      <th>tianqi</th>\n",
       "      <th>fengxiang</th>\n",
       "      <th>fengli</th>\n",
       "      <th>aqi</th>\n",
       "      <th>aqiInfo</th>\n",
       "      <th>aqiLevel</th>\n",
       "      <th>month</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2018-01-01</td>\n",
       "      <td>3</td>\n",
       "      <td>-6</td>\n",
       "      <td>晴~多云</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>59</td>\n",
       "      <td>良</td>\n",
       "      <td>2</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2018-01-02</td>\n",
       "      <td>2</td>\n",
       "      <td>-5</td>\n",
       "      <td>阴~多云</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>49</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>2018-01-03</td>\n",
       "      <td>2</td>\n",
       "      <td>-5</td>\n",
       "      <td>多云</td>\n",
       "      <td>北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>28</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>2018-01-04</td>\n",
       "      <td>0</td>\n",
       "      <td>-8</td>\n",
       "      <td>阴</td>\n",
       "      <td>东北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>28</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>2018-01-05</td>\n",
       "      <td>3</td>\n",
       "      <td>-6</td>\n",
       "      <td>多云~晴</td>\n",
       "      <td>西北风</td>\n",
       "      <td>1-2级</td>\n",
       "      <td>50</td>\n",
       "      <td>优</td>\n",
       "      <td>1</td>\n",
       "      <td>2018-01</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          ymd  bWendu  yWendu tianqi fengxiang fengli  aqi aqiInfo  aqiLevel  \\\n",
       "0  2018-01-01       3      -6   晴~多云       东北风   1-2级   59       良         2   \n",
       "1  2018-01-02       2      -5   阴~多云       东北风   1-2级   49       优         1   \n",
       "2  2018-01-03       2      -5     多云        北风   1-2级   28       优         1   \n",
       "3  2018-01-04       0      -8      阴       东北风   1-2级   28       优         1   \n",
       "4  2018-01-05       3      -6   多云~晴       西北风   1-2级   50       优         1   \n",
       "\n",
       "     month  \n",
       "0  2018-01  \n",
       "1  2018-01  \n",
       "2  2018-01  \n",
       "3  2018-01  \n",
       "4  2018-01  "
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bWendu</th>\n",
       "      <th>yWendu</th>\n",
       "      <th>aqi</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>month</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>2018-01</td>\n",
       "      <td>7</td>\n",
       "      <td>-12</td>\n",
       "      <td>60.677419</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-02</td>\n",
       "      <td>12</td>\n",
       "      <td>-10</td>\n",
       "      <td>78.857143</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-03</td>\n",
       "      <td>27</td>\n",
       "      <td>-4</td>\n",
       "      <td>130.322581</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-04</td>\n",
       "      <td>30</td>\n",
       "      <td>1</td>\n",
       "      <td>102.866667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-05</td>\n",
       "      <td>35</td>\n",
       "      <td>10</td>\n",
       "      <td>99.064516</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-06</td>\n",
       "      <td>38</td>\n",
       "      <td>17</td>\n",
       "      <td>82.300000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-07</td>\n",
       "      <td>37</td>\n",
       "      <td>22</td>\n",
       "      <td>72.677419</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-08</td>\n",
       "      <td>36</td>\n",
       "      <td>20</td>\n",
       "      <td>59.516129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-09</td>\n",
       "      <td>31</td>\n",
       "      <td>11</td>\n",
       "      <td>50.433333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-10</td>\n",
       "      <td>25</td>\n",
       "      <td>1</td>\n",
       "      <td>67.096774</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-11</td>\n",
       "      <td>18</td>\n",
       "      <td>-4</td>\n",
       "      <td>105.100000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2018-12</td>\n",
       "      <td>10</td>\n",
       "      <td>-12</td>\n",
       "      <td>77.354839</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         bWendu  yWendu         aqi\n",
       "month                              \n",
       "2018-01       7     -12   60.677419\n",
       "2018-02      12     -10   78.857143\n",
       "2018-03      27      -4  130.322581\n",
       "2018-04      30       1  102.866667\n",
       "2018-05      35      10   99.064516\n",
       "2018-06      38      17   82.300000\n",
       "2018-07      37      22   72.677419\n",
       "2018-08      36      20   59.516129\n",
       "2018-09      31      11   50.433333\n",
       "2018-10      25       1   67.096774\n",
       "2018-11      18      -4  105.100000\n",
       "2018-12      10     -12   77.354839"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "group_data = df.groupby('month').agg({\"bWendu\":np.max, \"yWendu\":np.min, \"aqi\":np.mean})\n",
    "group_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1cbb140fdc8>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEGCAYAAACevtWaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3hUVfrA8e9J76QnkJAESANCSQg1VBVBiiIdl11du66riFj3J+iuDUSU1cUV1450EAUVsQWQTkJPAgklIYGQkEJIT2bO7487hKDUZCYzmZzP8+Rh5s6de98Jk3fOnHPue4SUEkVRFMW62Jg7AEVRFMX4VHJXFEWxQiq5K4qiWCGV3BVFUayQSu6KoihWyM7cAQD4+vrKsLAwc4ehKIrSrCQlJZ2VUvpd7jGLSO5hYWHs3r3b3GEoiqI0K0KIzCs9prplFEVRrJBK7oqiKFZIJXdFURQrZBF97opSU1NDdnY2lZWV5g6lWXByciI4OBh7e3tzh6JYKJXcFYuQnZ2Nu7s7YWFhCCHMHY5Fk1JSUFBAdnY27dq1M3c4ioVS3TKKRaisrMTHx0cl9usghMDHx0d9y1GuSiV3xWKoxH791O9KuRaV3M3gcOFhdpzeYe4wFEWxYiq5NzG91PPUxqd46MeH2Hl6p7nDUeo5ceIEMTExl2z7+uuvGTNmTN39119/nfDw8Lr7a9eu5fbbbzfK+cPCwjh79qxRjqUoKrk3sa2ntpJZkomTnRMzNs7gVOkpc4ekXEW/fv3Ytm1b3f1t27bh4eFBXl4eAFu3biUhIcFc4SnKFank3sQWpy7G19mXL277ghp9DdN+nUZlrRoYsxS1tbXcfffddO3alfHjx+Pq6kqrVq3IyMgAICcnh3HjxrF161ZAS+79+vUDYMOGDfTt25e4uDgmTJhAaWkpoLXIZ82aRVxcHF26dCEtLQ2AgoICbr31VmJjY3nooYe4sCra779BzJ07l5deeqmpfgWKlVBTIZtQVkkWv+X8xsPdHibCK4LXB7zO33/5O//a/i9eSXhFDZIZvLz2ECmnSox6zE5tPJg1uvM19zt8+DAfffQRCQkJ3HvvvSxYsIB+/fqxdetWdDodERER9OnThx9++IFRo0axf/9+evbsydmzZ3nllVf46aefcHV1Zfbs2cybN4+ZM2cC4OvrS3JyMgsWLGDu3Ln873//4+WXX6Z///7MnDmTb7/9loULFxr1NSstm2q5N6ElaUuwFbZMiJwAwOC2g3m026N8c/QbFqctNnN0CkDbtm3rulmmTp3Kb7/9RkJCAlu3bmXr1q307duXXr16sWPHDvbs2UNUVBROTk5s376dlJQUEhIS6N69O5999hmZmRdrOo0dOxaAHj16cOLECQA2bdrE1KlTARg5ciReXl5N+2IVq6Za7k2kvKacNRlrGBo2FD+XixU6H+r2ECmFKby5600ivSLpGdjTjFFahutpYZvK7789CSHo168f7777LjqdjgceeAB3d3cqKytJTEys+yCQUjJ06FCWLFly2eM6OjoCYGtrS21t7RXPB2BnZ4der6+7r+azKw2hWu5NZO3RtZTWlHJX9F2XbLcRNrzW/zXaurdlxsYZ5JblmilCBSArK6tuAHXJkiX079+fTp06cerUKTZv3kxsbCwA3bt357///W9df3ufPn3YsmVLXd98eXk5R44cueq5Bg4cyJdffgnA999/T1FREQABAQHk5eVRUFBAVVUV69atM8lrVaybSu5NQErJkrQldPLpRDe/bn943N3Bnfk3zadKV6UGWM2sY8eOfPbZZ3Tt2pXCwkIeeeQRhBD07t0bX1/fulouffv25dixY3XJ3c/Pj08//ZQpU6bQtWtX+vTpUzdweiWzZs1i06ZNxMXFsWHDBkJCQgCwt7dn5syZ9O7dm1GjRhEdHW3aF61YJXFhhN6c4uPjpTUv1rH99HYe2PAAryS8wh3hd1xxv1+yfuGJX5/g9g63t7gB1tTUVDp27GjuMJoV9TtThBBJUsr4yz2mWu5NYHHqYrwcvRjebvhV97sp5CYe7vYw3xz9hqWHlzZRdIqiWCOV3E0spzSHjdkbGR85Hkdbx2vu/0i3RxgUPIg5O+ewO9d6v80oimJa10zuQoiPhRB5QoiD9ba9KYRIE0LsF0J8JYTwrPfY80KIDCHEYSHEMFMF3lwsS1uGQDAxauJ17W8jbHh9wOsEuwfz1Man1ACroigNcj0t90+B3/cn/AjESCm7AkeA5wGEEJ2AyUBnw3MWCCFsjRZtM1NRW8Gq9FXcFHITga6B1/08dwd33hnyDpW1lUxPnE6VrsqEUSqKYo2umdyllJuAwt9t2yClvDBZdzsQbLh9B7BUSlklpTwOZAC9jBhvs/Ldse8oqS75w/TH69HBswOv9X+NA2cP8Or2V7GEgW9FUZoPY/S53wt8b7gdBJys91i2YVuLI6VkcdpiIr0i6RHQo0HHuDn0Zh7s+iBfZXzF8sPLjRyhoijWrFHJXQjxD6AW+PLCpsvsdtkmpxDiQSHEbiHE7vz8/MaEYZGSziRxpOgId0Xf1agpjY92e5QBQQN4Y+cbJJ9JNmKEyrXceeedrFmzpu5+VFQUr7zySt39cePGsXr16kafJzExkVGjRjX6OIpSX4OTuxDibmAU8Cd5sc8gG2hbb7dg4LI1baWUC6WU8VLKeD8/v8vt0qwtTluMh4MHI9qPaNRxbG1seWPgG7Rxa8P0xOmcKTtjpAiVa7lQMAy0Co5ubm5/KP974SImRbE0DUruQojhwLPA7VLK8noPfQNMFkI4CiHaARFAi1uRIrcsl1+yfmFcxDic7ZwbfTwPBw/mD5lPeW050xOnU62rNkKUSn0vvvgi8+fPr7v/j3/8g4qKiktK+44aNYr8/HyklBw/fhxnZ2cCAwPR6XQ8/fTT9OzZk65du/LBBx8AWot88ODBjB8/nujoaP70pz/VjZ2sX7+e6Oho+vfvf0nr/6WXXmLu3Ll192NiYuoKjSnKjbhm4TAhxBJgMOArhMgGZqHNjnEEfjR0OWyXUj4spTwkhFgOpKB11/xNSqkzVfCWavnh5Ugkk6InGe2Y4V7hvNr/VaYnTue1Ha/xUr+XjHZsi/P9c5B7wLjHDOwCt71xxYfvu+8+xo4dyxNPPIFer2fp0qVs3bqVefPmUV1dzdatWxk0aBDHjh0jNTWVPXv21BUN++ijj2jVqhW7du2iqqqKhIQEbr31VgD27NnDoUOHaNOmDQkJCWzZsoX4+HgeeOABfvnlF8LDw5k0yXjvE0W54JrJXUo55TKbP7rK/q8CrzYmqOasSlfFyiMrGRQ8iCA3444lDw0dygNdHuDDAx/S2bdzXelgpfHCwsLw8fFhz549nDlzhtjYWAICAujcuTPJycls376dZ555hmPHjrF161b27NlzySId+/fvZ+XKlQCcO3eO9PR0HBwc6NWrF8HB2mSy7t27c+LECdzc3GjXrh0RERGAVlpY1XJXjE2V/DWy9cfXU1RVxF0db3z64/X4W/e/kVKYwms7XiPCM4Lu/t1Nch6zukoL25Tuv/9+Pv30U3Jzc7n33nsBrd9906ZNnD9/Hi8vL/r06cN7773Hnj17ePjhhwFtZtS7777LsGGXXrOXmJhYV+oXLi33e6VBdlXuVzEWVX7AiC5Mf+zQqgO9A3ub5By2NrbMHjCb1q6teTLxSfLK80xynpbozjvvZP369ezatasuUSckJPDBBx/QrZtWzbNr165s376drKwsOnfW6s4PGzaM999/n5qaGgCOHDlCWVnZFc8THR3N8ePHOXr0KMAlNeDDwsJITtZmRSUnJ3P8+HHjv1ClRVDJ3Yj25e8jpSCFKdFTTFrRsZVjK+YPmU9ZTRnTE6dTo6sx2blaEgcHB4YMGcLEiROxtdUurO7Xrx/Hjh2jb9++gNay9vf3Jz4+Hhsb7c/n/vvvp1OnTsTFxRETE8NDDz10yYIcv+fk5MTChQsZOXIk/fv3JzQ0tO6xcePGUVhYSPfu3Xn//feJjIw04StWrJkq+WtEz2x6ht+yf+OnCT/hYu9i8vP9cOIHZmycwYTICczsO9Pk5zMlSyhfq9friYuLY8WKFXX94ZbMEn5ninmpkr9NIL88nx9P/Mgd4Xc0SWIHGBY2jHtj7mXFkRWsPLKySc5prVJSUggPD+fmm29uFoldUa5FDagayYojK9BJHVOiLze5yHQej32ctMI0bYDVK+KyKz0p19apUyeOHTtm7jAUxWhUy90IanQ1rDiygv5B/QnxCGnSc9va2DJn4Bz8XfyZ/ut0zlacbdLzK4pimVRyN4INmRs4W3HWZNMfr+XCAOv5mvNqgFVRFEAld6NYnLaYUI9Q+rUxX52RKO8o/tnvn+zJ28PsXbPNFoeiKJZBJfdGOnT2EPvz9zMlego2wry/zuHthvPXzn9l2eFlfJX+lVljURTFvFRyb6TFaYtxsXPhjg53mDsUAB6Pe5w+rfvwr+3/4kC+keuzKJf473//y+eff27uMBTlslRyb4SCigK+P/49t3e4HTcHN3OHA4CdjR1vDnwTfxd/piVOUwOsJvTwww/zl7/8xdxhKMplqeTeCKvSV1Gjr2FKx6ad/ngtnk6evDPkHUqqSngq8Sk1wHoDxowZQ48ePejcuXNdMa9PPvmEyMhIBg0axAMPPMBjjz0G/LE8r6JYEjXPvYFq9DUsO7yMvq370r5Ve3OH8wfR3tG83O9lnt38LG/ufpMXer9g7pCu2+yds0krTDPqMaO9o3m217PX3O/jjz/G29ubiooKevbsyciRI5k1axZJSUm0atWKIUOGEBsba9TYFMUUVMu9gX7J+oW88jyzTX+8HiPaj+DuTnezJG0JazLWXPsJCv/+97/p1q0bffr04eTJk3zxxRcMHjwYPz8/HBwcVO115RK1+lrWH19PWc2VC8WZi2q5N9Di1MUEuQUxIGiAuUO5qmk9ppFWmMa/tv2LcM9wYnxjzB3SNV1PC9sUEhMT+emnn9i2bRsuLi4MHjyY6OhoUlNTzRKPYvmWpi1l9q7ZDG47mPlD5pt9xlx9lhNJM5JWmEZyXjJToqdga2Nr7nCuys7GjjcHvYmvsy/Tfp1GQUWBuUOyWOfOncPLywsXFxfS0tLYvn07FRUVJCYmUlBQQE1NDStWrDB3mIqFKKosYsG+Bfg5+5F4MpEP939o7pAuoZJ7AyxOXYyznTNjwseYO5Tr4uXkxTtD3qG4qpinNj7F/vz9lNeUX/uJLczw4cOpra2la9euvPjii/Tp04fWrVvz0ksv0bdvX2655Rbi4uLMHaZiIf6z9z+U15Tz4a0fMrL9SP6z9z9szt5s7rDqqJK/N6i4sphbVt7C6A6jmdV3lrnDuSHrjq3jhc0vINH+z4PcgojwjCDCK4Jwz3AivCII8wjD3ta+yWNrLuVrP/30U3bv3s17771n7lCaze/MGh0uPMzEdROZHDWZ53s/T0VtBX/+7s+cKjvFspHLaOvRtkniuFrJ3+tZIPtjYBSQJ6WMMWzzBpYBYcAJYKKUskhoK1TMB0YA5cA9UspkY7wIS7EqfRVVuqomr/5oDKPaj6KHfw9SC1NJL0onoziD9KJ0NudsRmdYx9xO2BHWKowIzwjCvcLr/g1yC7Ko/kRFMRcpJXN2zcHdwZ1Huz8KgLOdM28PeZvJ6yYzLXEai0YswtnO2axxXrPlLoQYCJQCn9dL7nOAQinlG0KI5wAvKeWzQogRwN/RkntvYL6U8prrzTWXlnutvpYRq0cQ7B7Mx8M+Nnc4RlOtq+b4ueNkFGfUJfyM4gxySnPq9nG2cybcM7yuhX/hXx8nH6OsOqVaoTdO/c7M4+fMn5mWOI1/9P4Hk6MnX/LYbzm/8ehPj3Jbu9t4Y8AbJl2RDRrZcpdSbhJChP1u8x3AYMPtz4BE4FnD9s+l9omxXQjhKYRoLaU83bDQLcvGkxs5XXaaZ3o+Y+5QjMrB1oEo7yiivKMu2V5aXcrRc0frkn1GUQYbszfyVcbFujVejl6XtPAjPLXE35ArdqWUJv9jsBaW0J3aElXpqnhz95uEe4YzPnL8Hx7vH9Sfx2If490979LFtwtTO001Q5Sahk6FDLiQsKWUp4UQ/obtQcDJevtlG7b9IbkLIR4EHgQICWnaGugNtThtMYGugQxuO9jcoTQJNwc3uvl1+8MCIAUVBaQXp5NRdLGl/1XGV1TUVtTt09q1dV0LP9wznEivSDp4dsDO5vJvOScnJwoKCvDxMc43AWsmpaSgoAAnJydzh9LifJHyBTmlOXx464dXfC/f3+V+Dp49yNzdc4nyjqJnYM8mjlJj7Hnul/urvGwTQ0q5EFgIWreMkeMwuvSidHbm7uSJuCeu+J/aUvg4++Dj7EOf1n3qtumlnlOlp+qSfXqx1trfemortXptsehwz3DmDZ5Hu1bt/nDM4OBgsrOzyc/Pb7LX0Zw5OTkRHBxs7jBalPzyfBbuX8iQtkMuee//no2w4bX+rzHl2ynM2DiD5aOWE+Aa0ISRahqapc5c6G4RQrQG8gzbs4H6w8TBwKnGBGgplqQtwcHGgXER48wdikWyETYEuwcT7B58yTebGl0NmSWZHDh7gHlJ85i8bjIvJ7zM8LDhlzzf3t6edu3+mPQVxVLMT55Prb6WGfEzrrmvm4Mb7wx5h7u+vYvpG6fzybBPcLB1aIIoL2ro9IdvgLsNt+8Gvq63/S9C0wc4Zw397eeqzrHu2DpGtB+Bl5OXucNpVuxt7Qn3CufOiDtZMXoFEV4RPL3xad7Y+YYqaKY0GwfPHuTro1/z505/vu6lNDt4duCV/q+wP38/b+x8w8QR/tE1k7sQYgmwDYgSQmQLIe4D3gCGCiHSgaGG+wDfAceADOBD4FGTRN3E1mSsoaK2ollOf7Qkga6BfDLsE6Z2nMqXqV9yz/p7OF3a7D/7FSsnpeSNnW/g4+TDg10fvKHnDg0dyr0x97LiyApWp682UYSXdz2zZa6U0W6+zL4S+Ftjg7IkOr2OpWlL6e7XnU4+ncwdTrNnb2vPs72eJS4gjhe3vMiEdRN4Y8Ab9A/qb+7QFOWyvjv+Hfvy9/HPfv/E1d71hp//eOzjpBSk8Or2V4n0imyy+k7qqpRr+C3nN7JLsy26+mNzNDR0KEtHLiXAJYBHf3qU9/a8h06vM3dYinKJ8ppy5iXNo5NPJ+4Ib9hqa7Y2tswZOAdfZ1+eTHySwspCI0d5eSq5X8PitMX4OftxS+gt5g7F6oS1CmPRiEXc3uF2Ptj/AQ/99JAqbKZYlE8OfUJeeR7P9XquUVdoezl58faQtymqLOKZjc/UzSAzJZXcr+L4ueNsPbWVCVETsLdp+norLYGznTOv9H+Ff/b7J3vz9jJx7UT25O0xd1iKwqnSU3xy8BNua3cbsf6NX6Clk08nXuzzIjtydzA/eb4RIrw6ldyvYknaEuxs7JgQOcHcoVi9OyPuZNGIRTjaOfLX9X/ls0OfqaswFbOalzQPgWB6j+lGO+Yd4XcwKWoSnx76lPUn1hvtuJejkvsVlFaX8nXG1wwLG4avs6+5w2kRor2jWTZqGUPaDmHu7rk8mfgkJdUl5g5LaYGSziTxw4kfuDfmXgJdA4167Gd7Pkt3v+7M3DKT9KJ0ox67PpXcr+Dro19TXlvOXdFqILUpuTu4M2/wPGbEz2DjyY1MXjfZ6OupKsrV6PQ6Zu+cTaBrIPfE3GP049vb2vPW4LdwtXc1aQNGJffL0Es9S9OWEuMTQ1e/ruYOp8URQnB357v5ePjHVOmq+NO3f2J1+mrVTaM0iTUZa0gtTGV6j+kmK9vr7+LPW4PeIud8Dv/Y/A/0Um/0c6jkfhnbTm3jRMkJNf3RzGL9Y1k+ajlxAXHM2jqLF7e8eElxMkUxtvPV5/n3nn8T6x/7hxIZxhYXEMfTPZ8mMTuRD/Z/YPTjq+R+GYvTFuPt5M2wsGHmDqXF83H24b+3/JeHuz3MN0e/4U/f/YkT506YOyzFSi3cv5CiyiKe7fVsk1QnnRI9hdHtR/P+3vfZlL3JqMdWyf13TpacZHP2ZsZHjm/yQj/K5dna2PK37n9jwS0LyC/PZ/K3k/nhxA/mDkuxMpklmSxKXcSY8DF09uncJOcUQjCz70yivKN4bvNzZJVkGe3YKrn/zpLDS7AVtkyMnGjuUJTf6R/UnxWjV9DBswMzNs5g9s7ZqviYYjRzd83F0daRx+Meb9LzOtk58fbgt7ERNkxLnGa0xetVcq+nvKacNelruDn0ZrPUX1auLdA1kE+HfcrUjlNZlLqIe364h9yyXHOHpTRzW3O2kpidyINdHzTL1Odg92DmDJhDRlEGL217ySiTB1Ryr2fdsXWcrzmvpj9auAvFx+YOmktGUQYT1k5gS84Wc4elNFM1+hrm7JpDW/e2TO1ovmXx+gX14/G4x/n++Pd8kfJFo4+nkruBlJIlaUuI9o42yqXGiukNCxvG0lFL8XX25ZGfHmHB3gWq+Jhyw5YfXs7Rc0d5Ov5ps4+z3RdzHzeH3My8pHnsyt3VqGOp5G6wM3cnGcUZ3BV9l1rDsxlp16odi0cuZnSH0by/730e/unhJqu6pzR/xZXFLNi7gD6t+1jE2shCCF5JeIUQjxBmbJzRqC5HldwNFqcuxtPRk9va3WbuUJQb5GznzCsJr/Byv5dJPpPMhLUT2Ju319xhKc3Af/b+h7KaMp7p+YzFNOouLNFXpatieuJ0qnXVDTqOSu5o1d8SsxMZGzEWJzu1onxzJIRgbMRYrfiYrVZ87PNDn6urWpUrSi9KZ/mR5UyInECEV4S5w7lE+1bteTXhVQ6cPcDrO19v0DFUcgeWHl4KwKSoSWaORGmsjj4dWTpqKQODB/Lm7jeZnjid89XnzR2WYmGklMzeNRs3ezf+1t0yF4+7OfRm7u9yPyuPrGTVkVU3/PwWn9wraytZnb6aIW2H0MatjbnDUYzAw8GDd4a8w4z4Gfx68lcmrp3I6vTVVNZWmjs0xUL8evJXdpzewd+6/w1PJ09zh3NFj3V/jH5t+vHqjlc5kH/ghp7bqOQuhHhSCHFICHFQCLFECOEkhGgnhNghhEgXQiwTQlj0ZZ7fHf+Oc1Xn1PRHK1NXfGzYx7jauzJr6yxuXXkr7+15j/zyfHOHp5hRta6aubvn0qFVByZGWfbFirY2tsweMBt/F3+eTHzyhlYqa3ByF0IEAY8D8VLKGMAWmAzMBt6WUkYARcB9DT2HqUkpWZy6mHDPcHoG9jR3OIoJxAXEsWL0Cj4e9jHd/LuxcP9Cbl11K//47R+kFqSaOzzFDBalLuLk+ZM80+sZ7GzszB3ONXk6efL24Lcprirm6U1PX/cSfY3tlrEDnIUQdoALcBq4CVhpePwzYEwjz2EyyXnJHC46zJToKRYzUq4YnxCCnoE9efemd1l35zomRU3ip8yfmLhuIvesv4efs35W8+NbiLMVZ/lg3wcMDh5Mvzb9zB3Odevo05FZfWexK3cX7yS9c13PaXByl1LmAHOBLLSkfg5IAoqllBc+WrKBoMs9XwjxoBBitxBid36+eb4mL05djLuDO6PajzLL+ZWmF+IRwnO9nuPHCT8yI34Gp0tPM+3XaYz6ahSLUhZRWl1q7hAVE/p38r+p1lczo+cMc4dyw0Z3GM2U6Cl8lvIZ3x///pr7N6Zbxgu4A2gHtAFcgctNEr/sXDQp5UIpZbyUMt7Pz6+hYTTYT5k/8XPWz9wZficu9i5Nfn7FvDwcPLi78918O/Zb3hr0Fn4ufszeNZtbVt7C7J2zyT6fbe4QFSM7VHCINRlr+HPHPxPqEWrucBrk6finifWPZdbWWRwpOnLVfRvTLXMLcFxKmS+lrAFWA/0AT0M3DUAwcKoR5zA6KSUf7PuAJxOfpLNPZx7o8oC5Q1LMyM7GjlvDbuXz2z5nycglDAoexNK0pYz8aiTTfp1G0pkkNVfeCkgpmb1zNl5OXjzY9UFzh9Ng9rb2vDXoLdzs3Zj267Sr7tuY5J4F9BFCuAitw/pmIAX4FRhv2Odu4OtGnMOoKmsreXbTs7y39z1GtR/Fx8M/tuhpUErTivGNYfbA2awft557Y+5l95nd3LP+Hiatm8Tao2tVeeFmbP2J9ezJ28MTcU/g5uBm7nAaxc/Fj3mD53G67PRV9xONaZUIIV4GJgG1wB7gfrQ+9qWAt2HbVCll1dWOEx8fL3fv3t3gOK5HXnkej//yOCkFKTwe9zj3xdynBlGVq6qorWDdsXUsSlnEsXPH8HX2ZXLUZCZGTcTLycvc4SnXqaK2gtFfjcbbyZslI5dga2Nr7pCMYsWRFUyMmpgkpYy/3OONSu7GYurkfvDsQZ745QnO15znjQFvcFPITSY7l2J99FLPtlPb+CLlC7ac2oKjrSOj2o9iasephHuFmzs85Rre3/s+C/Yt4NPhn9IjoIe5wzEqIcQVk7vlT/JspPXH1/N/W/4PHycfvrjtC6K8o8wdktLM2AgbEoISSAhK4GjxURalLmLt0bWsSl9F39Z9mdppKv2D+mMjWvwF3xbndOlpPj74McPDhltdYr8Wq22566WeBXsX8MH+D4jzj2Pe4Hn4OPsY9RxKy1VcWczK9JUsSV1CXkUeYR5hTO04ldEdRqvZVxbkmY3P8MvJX1g7Zi2t3VqbOxyju1rL3SqTe3lNOf+35f/4MfNHxoSP4cU+L5q9CL9inWp0NWzI3MAXKV9wqOAQHg4ejI8cz5ToKQS6Bpo7vBYt+Uwyd6+/m4e7PWyxxcEaq0Ul99yyXP7+y985UnSE6T2m85dOf1EDp4rJSSnZm7+XL1K+4OesnxEIbg29lfu73k+kV6S5w2tx9FLPlG+nUFBRwDdjvrHab1Mtps99X/4+nvjlCap0Vbx707sMDB5o7pCUFkIIQax/LLH+seSU5rAkdQmr0lexIXMDU6Kn8Gj3R3F3cDd3mC3G1xlfk1KQwhsD3rDaxH4tVjMCtPboWu5dfy/Ods4sGrFIJXbFbILcgpjRcwbfj/2esRFj+TL1S25fczvrjq1TF0Q1gdLqUuYnz6e7X3dGtBth7nDMptknd73U83bS27zw2wt08+/GkpFL6ODZwdxhKQqeTkhJMkMAACAASURBVJ7M7DuTJSOXEOgSyPObn+evP/z1mpeNK42z8MBCCioLeLbXsy26S7ZZJ/eymjKe+OUJPj74MRMiJ/DB0A/UFaeKxens25kvR37JrL6zyCjOYOLaiczZNUcVKTOBrJIsFqUs4o4OdxDjG2PucMyq2Sb3nNIc/vz9n9mcs5nnez3Pi31exN7G3txhKcpl2QgbxkeOZ92YddwZcSeLUhYxes1o1VVjZHN3z8Xexp4n4p4wdyhm1yyTe/KZZKasm0JuaS4LblnAXR3vatFfv5Tmw9PJk1l9Z7F45GICXALqumrSi9LNHVqzt+3UNn49+SsPdH0AP5emrzRraZpdcv8q/Svu23AfrRxb8eXIL5tVwX1FuSDGN4YvR3zJzL4zySjOYMLaCaqrphFq9bXM2TWHYLdg/tzpz+YOxyI0m+Su0+t4c9ebzNw6k/iAeBaNWES7Vu3MHZaiNJitjS0TIif8oavm22Pfqq6aGyCl5MMDH5JRnMGM+Bk42jqaOySL0CyS+/nq8zz2y2N8nvI5d0Xfxfu3vE8rx1bmDktRjOJCV82XI74kwCWA5zY/x70/3EtGUYa5Q7N45TXlPLf5ORbsXcDQ0KGqKGA9Fn+F6smSkzz2y2NklWTxfO/nLX61ckVpDJ1ex+qM1cxPnk9pdSl/6vgnHun2SLOvQW4K6UXpPLXxKTJLMnms+2Pc1+W+Fle87WpXqFr0b2Ln6Z1M+W4KBZUFfDD0A5XYFat3oatm7Zi1jAkfwxcpX3D7mttVV83vfHP0G+769i5Kqkr4cOiHPND1gRaX2K/FYn8byw8v56EfH8LHyYclI5bQq3Uvc4ekKE3Gy8mLl/q9xKIRi/Bz8VNdNQaVtZXM2jqLf/z2D7r4dWHl7StVbrgCi+uWuTDqvSRtCf2D+jNn4BxVk0Np0XR6HavSVzE/eT7lNeVaV033R3C1dzV3aE0qsySTpxKf4nDRYR7o8gCPdn8UOxurKo91w5pNVchzVeeYsXEG209v5+5Od/NkjyetZkksRWmsosoi5ifPZ1X6Kvyc/ZgRP4Pb2t3WIq7x2HBiAzO3zsTOxo7X+7/OgOAB5g7JIjSL5L7i5xX8/Ze/k1Oaw8w+M7kz4k5zh6UoFml//n5e3fEqKQUp9AzsyQu9XrDa5f5qdDW8lfQWX6Z+SVffrswdNNcqF91oKJMldyGEJ/A/IAaQwL3AYWAZEAacACZKKYuudpzobtHS+zlv7IQd7wx5h7iAuAbHpCgtQUvoqjlVeooZG2dw4OwBpnacyvQe07G3VSVG6jNlcv8M2Cyl/J8QwgFwAV4ACqWUbwghngO8pJTPXu04Lu1c5LB3hvHeze8R5BbU4HgUpaUprCxkfvJ8Vqevxt/Znxk9ZzA8bHiz76rZlL2JF357AZ1exz8T/snQ0KHmDskimSS5CyE8gH1Ae1nvIEKIw8BgKeVpIURrIFFKedVVqQOiAuSxg8esqtWhKE1pX/4+Xt3+KqmFqfQK7MXzvZ5vll01tfpa/rP3P/zvwP+I8opi3uB5hHiEmDssi2Wq5N4dWAikAN2AJOAJIEdK6VlvvyIppddlnv8g8CBASEhIj8zMzAbFoSiKRqfXsfLISubv0S6ASghKYHLUZPoH9W8WExPyy/N5ZtMz7D6zm3ER43iu13M42TmZOyyLZqrkHg9sBxKklDuEEPOBEuDv15Pc6zP2AtmK0pIVVhayNG0pK4+sJL8inzaubZgQNYGxEWPxdvI2d3iXteP0Dp7Z9AwVtRW82OdFRncYbe6QmgVTJfdAYLuUMsxwfwDwHBDODXbLqOSuKMZXo6/h16xfWXZ4GTtzd2JvY8+tYbcyOWoy3fy6WUS/vF7q+XD/hyzYt4BQj1DmDZrXLLuTzMWUA6qbgfullIeFEC8BFzrNC+oNqHpLKZ+52nFUclcU0zpafJRlh5fxzdFvKKspI9o7mklRkxjRboTZFpAuqizi+c3Ps+XUFka0G8GsvrNa7GLWDWXK5N4dbSqkA3AM+CtaSYPlQAiQBUyQUhZe7TgquStK0yivKWfdsXUsO7yMI0VHcLN3447wO5gYNZH2rdo3WRx78/YyY+MMCisLea7Xc0yInGAR3ySam2ZxEZNK7orSdKSU7M3fy9K0pWzI3ECtvpbegb2ZFD2JIW2HmOyyfikln6d8zjtJ7xDgGsC8wfPo5NPJJOdqCVRyVxTlis5WnGVNxhqWH17O6bLT+Dv7Mz5qPOMjxht1ubqS6hJmbpnJz1k/c1Pbm/hX/3/h4eBhtOO3RCq5K4pyTTq9js05m1l6eClbcrZgJ+y4KeQmJkdPJj4gvlHdJikFKTyV+BS5ZblM6zGNv3T6i+qGMQKV3BVFuSFZJVksP7ycrzK+oqS6hPat2jMpahKjO4y+oSqtUkpWHFnB7J2z8XTy5K1Bb9Hdv7sJI29ZVHJXFKVBKmsrWX9iPcvSlnGw4CDOds6Maj+KSVGTiPK+6gxnymvKeXnby3x3/DsS2iTw2oDXLHaefXOlkruiKI128OxBlh1exvfHv6dKV0WcfxyToiZxS+gtONg6XLLv0eKjTE+czomSEzza7VG1UpKJqOSuKIrRnKs6x5qMNSw7vIyT50/i7eTNuIhxTIicQGu31qw9upZ/bf8XznbOzBk4h96te5s7ZKulkruiKEanl3q2ndrG0sNL2ZS9CYBo72hSClLoEdCDOQPn4O/ib+YordvVknvLXqNKUZQGsxE2JAQlkBCUwKnSU6w8spKfsn7i/i7387fuf2vxS+CZm2q5K4qiNFNXa7mrEQ5FURQrpJK7oiiKFVLJXVEUxQqp5K4oimKFVHJXFEWxQiq5K4qiWCGV3BVFUayQSu6KoihWSCV3RVEUK6SSu6IoihVqdHIXQtgKIfYIIdYZ7rcTQuwQQqQLIZYJIRyudQxFURTFuIzRcn8CSK13fzbwtpQyAigC7jPCORRFUZQb0KjkLoQIBkYC/zPcF8BNwErDLp8BYxpzDkVRFOXGNbbl/g7wDKA33PcBiqWUtYb72UDQ5Z4ohHhQCLFbCLE7Pz+/kWEoiqIo9TW44LIQYhSQJ6VMEkIMvrD5MrtetqawlHIhsBC0kr8NjUNRrqSiWkdWYTn556twsrfBxcEOFwdbXBxtcXWww9neFhuby71lFaX5a0w1/QTgdiHECMAJ8EBryXsKIewMrfdg4FTjw1SUP5JSUlxeQ2ZhOZkFZWQVlNfdziwoJ+981TWP4Wxvi6ujLc4OWsJ3cbCt+xBwdbQzbLet98FgZ7ivbXN1tMXZXvv3wj7qQ0OxBA1O7lLK54HnAQwt9xlSyj8JIVYA44GlwN3A10aIU2mh9HrJ6ZLKS5K39q+WwM9X1l6yf4CHI6HergyM9CPU24UQHxcCPZyo1ukpq9JRXl1LebX2b1mVjooaHWVV2rayqtq6+2dLq/6w341wqfcBcOG2q+MfPzxcrvFB4epgh4ujbd2HhjaspSjXZop1sJ4FlgohXgH2AB+Z4ByKFams0ZFdVE5mgfaTdaH1XVhOdmEF1Tp93b72toJgLxdCvF2IC/EixNuFUB9XQn1caOvlgrODrUli1Oullvira6mo1tV9UJRV66gwfABc+OAoq9ZRXlXvsWodFdU6SqtqySuporymlvIq7ViVNfprn9xACHCx17491H0gONT71mH4EHB1sMPHzYHubb3oGtwKJ3vT/E4Uy2aU5C6lTAQSDbePAb2McVzFepRV1XIsv6yuxX2h9Z1VUM7pkkrqr/bo6mBLiI8rkf7uDO0YQIiPC2E+roR4u9DG0xlbM3R52NgIXB3tcHU0bntIZ/jQuPBhUPcBUWX4EKm37Y/7aLfPV9ZypqTykm8iVbXah4a9raBzm1bEh3rRw/Dj7+Fk1NegWCa1gq1idFJKcoorSMosqvtJPV2Cvl4C93VzJNTHhT7tfQjxcSHUx4UQb60F7uPq0GK6H2xtBG6OdrgZ+UOjsKy67nefnFnEF9sz+d9vxwFo6+1Mj5ALyd6bqEB3s3xgKqalFshWGq1GpyflVAm7DYkkKbOI3JJKQOt7jg3xpEeoN51aexiSuIvRW8DK1VXX6jl06lxdwt+dWUS+YcDZzdGO2BBP4gwJPzbEE3cnezNHrFyPqy2QrZK7csOKy6svaZXvyy6u6zsO8nSmR6gX8WFexIV4ER3ojp2tKmFkaaSUZBdVGBJ9IUmZxRzO1b5dCQFRAe7Ehxla9yHetPV2bjHfppoTldyVBpNScuxsGUkniuoSwdH8MgDsbASd23jQI9S7rj83sJXqz22uzlfWsPdkcd2H9p6sYkqrtNlIfu6OF7tywrzo3MYDRzs1UGtuV0vu6ruxconKGh37ThaTlFVE0okikrOKKCqvAcDTxZ4eIV6MjQsmPtSLrsGeJpudojQ9dyd7BkT4MSDCD9AGe4+cOV/X3bY7s5D1h3IBcLCzoVtwK+JCveqSvo+boznDV35HtdxbuDMllVqL/EQRSVlFHMo5R61h5LODn2tdi7xHqDftfV3VxTktXJ7h/ZKUqb1fDuaco0anvV/a+boSF+JFvw4+DIjwVbNymoDqllEAKK/WpiPuydIG1JIyi8guqgDA0c6Gbm09tf7yUC9iQ7zwdlXVmpWrq6zRcSDn3MUGQmZh3Te96EB3Bkb6MSDCl55h3mq+vQmo5N5CSCkpLKu+eBVnvbnkmYYaKxf4uzsaBsy0/vJOrT1wsFMDn0rj6PWSlNMlbE4/y+b0fHafKKJap8fRzoZe7bwZGOHHgEhfogLc1QCtEajkbkV0esmp4grDVZz1krfhys4LA2AXtG7lZLiK8+KVnN2CPQn2UrMfFNMrr65lx/FCNh3JZ3P6WTLySgGtcTEgwo+Bkb4khPviq/rrG0Ql92amskbHybrkXU6W4VL8rIJyThaV1/VxgnYFYlsvrYZKaL1L8UN9XAj2clFfhRWLcqq4gt/Sz7IpPZ/fMs5SbOjC6dzGQ0v2Eb70CPNSM3Guk0ruFqi4vPrS5F2vKNaFC4AucHe0+8NVnBeKYrVuZZ7L8RWlsXR6yaFT59icfpZNR/JJyiyiVi9xtreld3tvBkT4MSjSlw5+bupb5hWo5G5BMgvKeHrlfnYeL7xku7+746XJ23AlZ6iPK14u9urNrVi90qpadhwrqOvCOXZWu56idSsnBkT4MiDCj4RwXzXQX49K7hZASsmXO7J47btUbIXgwYHtiQx0r0viLg7qkgNFqe9kYTm/ZWgDs7+ln6WkshYhoEtQq7pkHxfi1aInAqjkbma55yp5dtV+Nh7Jp3+4L3PGd6WNp7O5w1KUZkOnl+zPLq6bhZOcVYxOL3FxsKVvex8GRvoxKNKPMF9Xc4fapFRyNxMpJd/sO8WLaw5SrdPzwoiOTO0dqi4EUpRGKqmsYfvRAjala104mQXlgFYTZ1hMIMM7B9KxtfVPt1TJ3QwKy6r5vzUH+O5ALrEhnrw1oRvt/dzMHZaiWKXMgjJ+Ts3jh0O57DpRiF5CiLcLw2MCGdY5gNi2XlbZqFLJvYn9nHqGZ1cd4FxFNdNuieShge1VZURFaSJnS6v4KeUM6w/lsiXjLDU6ib+7I7d2DmB459b0bu+NvZX8Park3kTOV9bwr3UpLN+dTXSgO/MmdqdTGw9zh6WYS2012NhqP4pZlFTW8Gua1qL/NS2fihodrZztubmjP8M7BzIw0q9ZXwtikuQuhGgLfA4EAnpgoZRyvhDCG1gGhAEngIlSyqKrHcsakvu2owXMWLGP0+cqeGhQB6bdEqEuxGhpzp+Bk9vh5E44uQNO7QWpAxcfcPUHN8OPqx+4BfzxtouP+iAwocoaHZvTz7L+YC4/pZ7hXEUNzva2DI7yY3hMIEOi/fFoZouUmCq5twZaSymThRDuQBIwBrgHKJRSviGEeA7wklI+e7VjNefkXlmjY876w3y85ThhPi68NbEbPUK9zR2WYmp6HeSlaEn85E7I2g7Fmdpjto4QFAfBPcHOEUrzoCwfSs9AaT6U5UFt5R+PKWzAxbfeh4A/uBmS/+9vu3irD4JGqNHp2XGskB8O5fLDoVzyzldhbytICPdlWOdAhnYKaBYlEZqkW0YI8TXwnuFnsJTytOEDIFFKGXW15zbX5L7vZDHTl+/laH4Zf+kbynO3Rav56taqsgRydl9M5Nm7ofq89pirP4T0hra9oW0faN1VS+pXIiVUlVxM9PWT/iW3DT+6qj8eQ9horf4rfSPw7qB9wFj5bBFj0Osle04W88OhXNYfzCWrsBwbAfFh3gzvHMiwmECCLHTqssmTuxAiDNgExABZUkrPeo8VSSm9LvOcB4EHAUJCQnpkZmY2Oo6mUqPT8+7P6fwn8Sh+bo68OaFr3QIHihWQUmuFX0jkJ3dC3iGQekBAQGdo20tL5G17gVeY6ZJo3QeBIdHXT/qX3DZ8M9BVX3yuX0foeR90nQROauznekgpScs9z/qDWos+LVf7AO8S1Mow8yaQcH/LmfVm0uQuhHADNgKvSilXCyGKrye519ecWu5Hzpxn+vK9HMwpYWxsELNu70wr5+bVT6f8Tm015O43JHJDN0uptuIQDm4QHH8xkQfHg1Mr88Z7JVJC5Tkt0Wdth90fwak9YO8KXSdA/H3atwrlup04W6a16A/lsierGIBwfzeGGWbexAR5mHUuvcmSuxDCHlgH/CClnGfYdhgr7JbR6SUf/XaMuRuO4OZox2t3xjA8prW5w1IaoqwAsuu1yk8lX+wD9wy5mMhD+oB/p+bdt52TrCX5A6ugtkIbB4i/DzrfCfZqpaQbkXuukg0pWot++7FCdHpJkKczwzoHcnv3NnQLbtXkid5UA6oC+Axt8HRave1vAgX1BlS9pZTPXO1Ylp7cswrKmbFiHztPFDK0UwCv3dkFP3fLH2xR0FqzZ49cTOQnt0NBhvaYjT207qb1lYf0huBe4GGlH9gVRbB3Cez+GArSwdkLYqdCj7+CTwdzR9fsFJVV81PqGX44lMum9LNU1+pp7+fK2NggxsQGEezl0iRxmCq59wc2AwfQpkICvADsAJYDIUAWMEFKWXjZgxhYanKXUrJk50le+TYFWyGYdXtnxsUFWf0lzc2eXq+1zFPXQuo3UJylbXf2vpjI2/aGNrFgb5kDZSYjJRzfpLXm074FfS10uElrzUcOB1s1IeBGlVTW8P2B06xKzqmr9tq7nTfj4oK5rUsg7iacXqkuYmqAMyVasa/Ew/kkhPswZ3w3ix0xV9D6zU9s1hJ62rfaYKOtA7QfDFEjIKw/+ISr2SP1nc+F5M8h6VMoyQGPIIi7G+L+Yr3fYEzsZGE5a/bk8NWeHI6dLcPRzoZbOwcyNjaIARG+Rr9SXSX3G3Sh2FdVrY7nhkfzl75hVlmXotmrLoejv2gJ/cj32mCivStEDIWOoyHiVjVL5HroauHIeq01f/QXsLGD6JFaa77dQPWB2ABSSvaeLOarPTl8s+8UxeU1+Lo5cnu3NoyNC6JzG+MMxKrkfp2Kyqr5v68P8u3+03Rv68m8iarYl8WpKIb0DVp3S/pP2iChs5fWOo8eBR2GtLyuFmMqOApJn8CeRVo/vU8ExN8L3adov2flhlXX6kk8nMdXe3L4OTWPap2eyAA37owNZkxsG1q3avj7VSX36/BrWh7PrNpPcbkq9mVxSvO0rpbUtVp/sb4G3FtrrcuOoyE0AWzVdFSjqqmElDWw6yNt/MLOGbqM01rzQXHmjq7ZKi6v5tsDp1mdnENSZhFCQL8OPoyNDWZ4TCCujjc25qGS+1WUVtXyyroUlu46SVSAO/MmdaNzGwudx9ySFGVC2jpIXQdZ2wAJXu20ZN7xdgjqATbqw7dJnN6vddnsXwE1ZdpAdPx9EDMOHJpmVog1OnG2jK8M/fNZheU429syPCaQO2ODSAj3va61kVVyvwy9XrLtWAHPrtrPqeIKHhzYgSeHqmJfZpV/WOtuSV0Lp/dp2wJitIQePUq7MlT1/5pP5TnYv1xrzeenahdzdbtL67bxizR3dM2WlJKkzCJW78lh3b5TlFTWEuDhyB3dg7gzNoiOra88bqSSO1BRrWNfdjFJmUUkZRaRnFVEcXkNoT4uzFPFvsxDSu0KytS12k9BurY9uBd0HKUldDUH2/JICZlbtdZ8yjdaN1nYAOh5v9ZVprrIGqyyRsevaXmsSs4h8XAetXpJx9YejI0N4o7ubfD3uPTCsxaZ3HPPVZKUWcTuzEKSM4s4dKqEWr32WsP93egR4kWPMC9GdW2tin01Jb1O62ZJXat1uZRkg7DVpip2HK0lB4825o5SuV6lebDnC9j9KZzLArdALcn3vE+rXKk0WEFpFev2n2b1nhz2nSzGRkD/CD/GxQVxa6dAnB1srT+51+r0pOWer2uVJ2UWkVNcAYCTvQ3dgj3pEepFfJgXsW298HJ1MFboyvXQ6+H4Rji0GtK+g/KzWlnc8Ju1hB45XCWC5k6vg4yfYOeHkPEj2LtA7J+h76NaYTWlUTLySuvmz+cUV+DqYMttXVrz1sTu1pXcSypr2JNVTNKJQpKyitibVUxZtQ6AAA9H4kO96RHqRY9QLzq18bCaJbWanfJC2Puldsl74TFwcIfIYVqXS/hQcFTTTK3SmRTY9p7WPy910OkO6Pe4mmVjBHq9ZOeJQlYnZ/PdgVwO/XN4803uUkqyCsvZfaKIpKwikk4UcSTvPFKCjYCOrT2ID/UizpDMgzydVXkAc5JSq3W++yM4uFqrRd62j/Y1vePtqlhVS1JyCnb8F3Z/opUtDhugJfnwW9RMJyOoqNbh4mjXfJJ7Va2OgznntP7yE9rA59lSrUa1u6MdsaFexBsSefe2njc8L1QxkeoyOLBCm0mRu18rldt1kjaTIjDG3NEp5lRZopU52L5AK3PgFw39/g5dJlx9URPlmiy+zz2yczf51zeXsjuziAPZ56jWaXXIQn1c6rpX4kO9ifB3U2UALE1emtZK37dUa50FxGgJvetEcHQ3d3SKJdHVaN/mtv4bzhzUBl/7PKxVpnT2vPbzlT+w+OTu2DpCht77b2KCPIgP8yYuREvoqqyuhaqt1uaj7/4YMrdoBbo6jdG6Xtr2VnPRlauTUqths/XfcCxR+5bX4x7o/TB4tjV3dM2KxSf3Tl27y+SkJJzs1QVEFq04S6sgmPy5ttqPZ6jWSo+dCq6+5o5OaY5O74et78LBVVqjoPNYrctGrRh1XSw+uVtCbRnlCvQ6yPhZ63o58oP2Bxg5XLv8vMNNamBMMY7ik7D9fUj+DKpLtVLN/R7X3mPqm+AVqeSu3LjSfO3ilKRPtBa7q79W57vHPeqrs2I6FcXae277f7V1bAO6aC35mLHqytfLUMlduT5SXlxYOeVr0FVr09fi79VKAdipi7+UJlJbpc2+2vou5KdpC4n0eURbTETV6K+jkrtydZUlsH+ZNkCalwKOrbT63fH3gt9V1zZXFNPS67UrXrf8GzJ/096b8fdA70fUalGo5K5cSe4BbV76gRVaP2frblpdkJhx4OBq7ugU5VI5SVpLPuVrrR5R14lal41/R3NHZjZXS+4muwJICDEcmA/YAv+TUr5hqnMpN6CmUvvj2P0RnNwBdk5aMr+wCIMavFIsVVAPmPApFB7XLojas0grbxE+FBIe17oQ1fu3jkla7kIIW+AIMBTIBnYBU6SUKZfbX7XcTai2SquNnrVdS+aZWwzLp4Vr3S7dpqiiXUrzVF6offPc+YE2NdcnAkL7QUgf7XoL7/ZWn+zN0XLvBWRIKY8ZAlgK3AFcNrkrRlSaryXxkzvg5E6tXrquSnvMuz1E3gbdJkG7QVb/xlesnIs3DHoa+j2mXSGd9i0cWqNNpwRw8dWSfEhv7d/W3VtUbSNTJfcg4GS9+9lA7/o7CCEeBB4ECAkJMVEYVk6v12YSXEjkJ7dr1RdBu2q0TSz0fkh7Y7ftBW7+5o1XUUzB3hni/6r96PVw9rDhm6rhb+Lwt9p+tg5agm/b62Lr3or/JkyV3C/XJLyk/0dKuRBYCFq3jInisC5VpdqgUl3LfBdUndMec/XT3qw9/qr926a7KsqktDw2NtoAq39HLdmD9m02e+fFhL9zoVaSGLR1eeu37v2iwcY6rpQ3VXLPBupf6RIMnDLRuayTlHAuu14i3wG5B7X62AjtzRsz9uIb06ud6mZRlMtx89NW+Ioeqd3//TjU0Z9h/1LtMUcPCO558e8qqEezLYBnquS+C4gQQrQDcoDJwF0mOpd10NVoUxMvJPKsHXDe8Hlo7wrB8TDgKcMbLl5V0VOUhrJz1Lpm2vbS7ksJRce1Vv2F1n3i64AEYaMtzN62z8WE36pts2hImSS5SylrhRCPAT+gTYX8WEp5yBTnarbKCyF718VEnpMEtdrSgLQK0Ub9L7yZ/DuDrapbrygmIYQ22cC7PXSbrG2rKIac3drf5skdsHcx7PpQe8y9tWEcy/D3GdjVIksjqIuYmkpNhbYw9NFf4OivWj1rABs77c1x4Y0S3AtaBZk3VkVRLqWrhbxDl7buz2Vpj9m7QNRt0HWyVuisCRti6gpVc5BSu5T/6C/aT+ZWqK3URuxD+kK7gdqIfZs4cHAxd7SKotyoklNaq/74Jjj0lXb9iKs/dBmvfQMI7Gry7huV3JtKab62+MCFhF6aq233i9Y+0TvcrHW3qGSuKNalthrSN2gDs4fXg74G/DpqSb7rRPBoY5LTquRuKrVV2le0C8k8d7+23dkbOgzREnr7IaqbRVFakvJCrSW/f5nWskdo39S7TYGOo8HRzWinUsndWKSE/MP1ulq2QE251m/eto+W0MNvhsBuahELRVGg4CjsXw77lkBxptY/33G0tnh8+8GNnlOvkntjlBXA8cSLA6ElOdp2nwhDV8tNEJbQbOfCKorSBKTUWvH7lmit+spz2qybLuO1Fn1A5wYdViX3G1FbrV3NdqF1fmovU68pFwAACCRJREFUIMHJU/uk7XCT1kL3VCUTFEVpgJpKOLJe67ZJ3wD6Wm3FqW6ToMsEcA+87kOp5H41UkJBxsVkfnwz1JRp9aLb9rrYOm8TazWXJSuKYiHKzsLB1dpAbE6SdtFU+yFaaz565DUnX7Ts5C4lVJVoM1nK8qD0zMXb53LgxG8X56t6t6/X1dIfnFqZJiZFUZTfyz+iteb3L4NzJ8HBDTrdofXPhw247Die9SV3KaHqvFbDufQMlOZd4bYhiddW/vEYwkYrthXc82JC925nvBelKIrSEHo9ZG019M9/DdXntTVku07ULpTyj67btXkk9127tKXeSvMMCTrv6revlLBdfLUynq5+4BagFQ1y9f/jbRdv1c2iKIplq6mAw99p9eozftYKB7burs2fjxmPcPe38OTe1kXufsjjYm2VSwhw9TUkZUPCdvXTEnjd7QDtvouPStiKolin0jw4sFLrnz+9D4Qt4qWipl9D9YY4uELP+wwt7vpJ3JCwVdEsRVFaOjd/6Puo9pOXqrXm+ecVd7eMlrslTYVUFEVpJq7W564uo1QURbFCKrkriqJYIZXcFUVRrJBK7oqiKFZIJXdFURQrpJK7oiiKFVLJXVEUxQqp5K4oimKFLOIiJiHEeeCwueNoYr7AWXMH0cTUa24Z1GtuOqFSSr/LPWAp1/UfvtJVVtZKCLFbvWbrp15zy2CJr1l1yyiKolghldwVRVGskKUk94XmDsAM1GtuGdRrbhks7jVbxICqoiiKYlyW0nJXFEVRjEgld0VRFCvUoOQuhGgrhPhVCJEqhDgkhHjCsN1bCPGjECLd8K+XYXu0EGKbEKJKCDHjd8d60nCMg0KIJUIIpyuc827DcdOFEHfX2/6qEOKkEKK0Ia+lmb7m9UKIfYZj/FcIYZK1BS3sNScKIQ4LIfYafvyt+TULIdzrvda9QoizQoh3rPk1G7ZPEkLsNxxjjilerxlf83ohRLEQYt3vtj8mhMgQQkghhK/RXqSU8oZ/gNZAnOG2O3AE6ATMAZ4zbH8OmG247Q/0BF4FZtQ7ThBwHHA23F8O3HOZ83kDxwz/ehluexke62OIp7Qhr6WZvmYPw78CWAVMbgGvORGIN+X/saW95t/tlwQMtObXDPgAWYCfYb/PgJut4TUbHrsZGA2s+932WCAMOAH4Gus1NqjlLqU8LaVMNtw+D6QaXuQdhv+QC/8xYwz75EkpdwE1lzmcHeAshLADXIBTl9lnGPCjlLJQSlkE/H979xciVQHFcfx7aEvIhbQeNvsD9g8W+rdP2h+DMtGQECGCzCLqIcgH6TkItreoCKKHXqyg2EIQqQ0Jq+0hE7QIRbeyEpUypNagFCrJ9vRwztRtnd12Zmfm3q6/Dwy7c+f++8l47v+z7wN35bx3ufuxdnK0omKZTxTmcx7QlaviVcrcK1XMbGbXEMVlxxzjNVWhzFcCX7v7RI73AXBPByKeoYTMuPsYcLLJ8D3ufmROgZqY8zl3M1tMbHl2AwONQps/Zzx0dvfvgeeIrfUx4Bd3f6/JqJcC3xXeH81hpahCZjPbDvxIfFm2tBll1qqQGXg1T1E8aWbWZpRZq0hmgHXAZs/dvG4qOfNBYNDMFmehXAtcPpc8s9GjzD03p+JuZv3EaYHHC3uTrUy/kNhSXgFcAsw3sweajdpkWCn3cFYls7uvIg4t5wHLW12PVlQk83p3vx64LV8PtroerahI5ob7gDdbXYdWlZ059+IfAzYTRylHgNOtrkcrepi559ou7mZ2LvGPMuLuW3PwD2a2KD9fROxZzmQFcNjdJ9z9D2ArcIuZLS1cSFpDbNmLW/DLmObQp5uqltndfwdGiS9XV1Qlc+4hNQ6h3wCWdCbhmaqSOZd1I9Dn7p91JNw0qpLZ3d9x96XufjPRTPCbTmWcqseZe67du2UMeBn40t2fL3w0CjSufD8EvP0fs/oWuMnMzs953pnz3O3uQ/kaBbYDK81sYW4pV+awnqlKZjPrL3z5+oDVwIFO5SyqUOa+xl0E+R/ybmC8UzmLqpK5MJ91dHmvvUqZLe+CyuEbgE2dSflvJWTuPW/vSvMy4tBxH7A3X6uJq91jxNZ2DLgwx7+Y2FqfAH7O3xt3fDxFFKdx4HVg3jTLfIQ4J3cQeLgw/Jmc32T+HG4n0/8lMzAAfJrr8TnwIrFnV+fM84m7RRqZXwDOqXPmwmeHgMFuZK1iZmJD9kW+unIXWImZdwATwG85/aocvjHfnyaOYDZ1IqPaD4iI1JCeUBURqSEVdxGRGlJxFxGpIRV3EZEaUnEXEakhFXeRNpjZAjPbUHh/u03p9idSJhV3kfYsIB6yEakkFXepvWxEdcDMNln03B4xsxVmttOib/cSiz7eb1n0Et9lZjfktMNm9opFP/lDZrYxZ/s0cFU+Xv5sDus3sy25rJF8YlGkFH1lr4BIj1wN3As8Sjzhez/xlOIa4AmiS+Eed19rZsuB14ChnHYQuIPo+/2Vmb1E9Pq+zt2HIE7LEJ0FryWeMtwJ3Ap83ItwIlNpz13OFofdfb+7TxItDMY8Hs/eT/yhhGXEo+O4+4fARWZ2QU67zd1PuftxopHUwDTL+MTdj+Yy9uZ8RUqh4i5ni1OF3ycL7yeJI9iZWu8Wp/2T6Y94ZzueSNepuIuEj4D18PcpluM+c3/vk8RpGpFK0p6FSBgm/tLTPuBX/mn72pS7/5QXZMeBd4Ft3V9FkdlTV0gRkRrSaRkRkRpScRcRqSEVdxGRGlJxFxGpIRV3EZEaUnEXEakhFXcRkRr6C+eVESANkvF+AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "group_data.plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
